package pe.gob.mininter.dirandro.vaadin.panel.seguridad;

import java.util.ArrayList;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import pe.gob.mininter.dirandro.model.Dependencia;
import pe.gob.mininter.dirandro.model.Opcion;
import pe.gob.mininter.dirandro.model.Policia;
import pe.gob.mininter.dirandro.model.Rol;
import pe.gob.mininter.dirandro.model.Usuario;
import pe.gob.mininter.dirandro.service.DependenciaService;
import pe.gob.mininter.dirandro.service.PoliciaService;
import pe.gob.mininter.dirandro.service.RolService;
import pe.gob.mininter.dirandro.service.UsuarioService;
import pe.gob.mininter.dirandro.util.Constante;
import pe.gob.mininter.dirandro.util.RandomUtil;
import pe.gob.mininter.dirandro.vaadin.dialogs.ConfirmDialog;
import pe.gob.mininter.dirandro.vaadin.panel.mantenimiento.PanelMantenPolicia;
import pe.gob.mininter.dirandro.vaadin.util.DirandroComponent;
import pe.gob.mininter.dirandro.vaadin.util.Injector;

import com.vaadin.annotations.AutoGenerated;
import com.vaadin.data.Item;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.data.Property.ValueChangeListener;
import com.vaadin.data.util.BeanItemContainer;
import com.vaadin.data.util.IndexedContainer;
import com.vaadin.event.FieldEvents.TextChangeEvent;
import com.vaadin.event.FieldEvents.TextChangeListener;
import com.vaadin.event.ShortcutAction.KeyCode;
import com.vaadin.event.ShortcutListener;
import com.vaadin.ui.AbstractSelect.Filtering;
import com.vaadin.ui.Alignment;
import com.vaadin.ui.Button;
import com.vaadin.ui.Button.ClickEvent;
import com.vaadin.ui.Button.ClickListener;
import com.vaadin.ui.ComboBox;
import com.vaadin.ui.HorizontalLayout;
import com.vaadin.ui.Label;
import com.vaadin.ui.Table;
import com.vaadin.ui.TextField;
import com.vaadin.ui.VerticalLayout;
import com.vaadin.ui.Window;

public class PanelSegUsuario extends DirandroComponent implements ClickListener, TextChangeListener, ValueChangeListener {

	/*- VaadinEditorProperties={"grid":"RegularGrid,20","showGrid":true,"snapToGrid":true,"snapToObject":true,"movingGuides":false,"snappingDistance":10} */

	@AutoGenerated
	private VerticalLayout mainLayout;

	@AutoGenerated
	private HorizontalLayout pnlPrincipal;

	@AutoGenerated
	private VerticalLayout verticalLayout_3;

	@AutoGenerated
	private HorizontalLayout horizontalLayout_2;

	@AutoGenerated
	private Button btnEliminarUsuario;

	@AutoGenerated
	private Button btnCrearUsuario;

	@AutoGenerated
	private TextField txtCargoDescripcion;

	@AutoGenerated
	private TextField txtCargo;

	@AutoGenerated
	private ComboBox cmbRol;

	@AutoGenerated
	private ComboBox cmbOficina;

	@AutoGenerated
	private TextField txtApellidoMaterno;

	@AutoGenerated
	private TextField txtApellidoPaterno;

	@AutoGenerated
	private TextField txtNombres;

	@AutoGenerated
	private HorizontalLayout horizontalLayout_1;

	@AutoGenerated
	private Button btnAgregarPolicia;

	@AutoGenerated
	private ComboBox cmbPolicia;

	@AutoGenerated
	private TextField txtUsuario;

	@AutoGenerated
	private VerticalLayout verticalLayout_2;

	@AutoGenerated
	private Table tblUsuarios;

	@AutoGenerated
	private HorizontalLayout horizontalLayout_3;

	@AutoGenerated
	private TextField txtFiltroOficina;

	@AutoGenerated
	private TextField txtFiltroCargo;

	@AutoGenerated
	private TextField txtFiltroApeMaterno;

	@AutoGenerated
	private TextField txtFiltroApePaterno;

	@AutoGenerated
	private TextField txtFiltroNombres;

	@AutoGenerated
	private TextField txtFiltroUsuario;

	@AutoGenerated
	private Label label_1;

	private static final long serialVersionUID = -7471103131807561289L;
	
	private PanelMantenPolicia pnlMantenPolicia;

	private UsuarioService usuarioService;	
	private RolService rolService;
	private DependenciaService dependenciasService;
	private PoliciaService policiaService;
	private boolean flagNuevoUsuario;
	
	private List<Policia> lstPolicias;
	private List<Dependencia> lstDependencias;
	private List<Rol> lstRoles;
	private List<Usuario> lstUsuarios;
	private String clave;
	
	public PanelSegUsuario(List<Opcion> acciones, String height) {
		super(acciones, height);
		usuarioService = Injector.obtenerServicio(UsuarioService.class);
		rolService = Injector.obtenerServicio(RolService.class);
		dependenciasService = Injector.obtenerServicio(DependenciaService.class);
		policiaService = Injector.obtenerServicio(PoliciaService.class);
		
		buildMainLayout();
		setCompositionRoot(mainLayout);
		postConstruct();
	}

	@Override
	public void postConstruct() {
		
		flagNuevoUsuario = true;
		btnCrearUsuario.setIcon(Constante.ICONOS.SAVE);
		btnEliminarUsuario.setIcon(Constante.ICONOS.DELETE);
		btnAgregarPolicia.setIcon(Constante.ICONOS.CREATE);
		
		lstRoles = rolService.buscar(null);
		BeanItemContainer<Rol> bicRoles = new BeanItemContainer<Rol>(Rol.class,  lstRoles);
		cmbRol.setInputPrompt("Rol");
		cmbRol.setContainerDataSource(bicRoles);
		cmbRol.setItemCaptionPropertyId("nombre");
		cmbRol.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbRol.setImmediate(true);
		cmbRol.addListener((ValueChangeListener)this);
				
		lstPolicias = policiaService.buscar(null);
		BeanItemContainer<Policia> bicPolicias = new BeanItemContainer<Policia>(Policia.class, lstPolicias);
		cmbPolicia.setInputPrompt("Policia");
		cmbPolicia.setContainerDataSource(bicPolicias);
		cmbPolicia.setItemCaptionPropertyId("nombreCompleto");
		cmbPolicia.setImmediate(true);
		cmbPolicia.addListener( new ValueChangeListener() {
		
			private static final long serialVersionUID = 4418094011985520491L;

			@Override
			public void valueChange(ValueChangeEvent event) {
				pintarPersona(event);
			}

			private void pintarPersona(ValueChangeEvent event) {
				
				if( cmbPolicia.getValue() != null){
					Policia  policia = (Policia) cmbPolicia.getValue();
					txtApellidoPaterno.setValue(policia.getPersona().getApePaterno());
					txtApellidoMaterno.setValue(policia.getPersona().getApeMaterno());
					txtNombres.setValue(policia.getPersona().getNombres());
					txtCargo.setValue(policia.getCargo() != null ? policia.getCargo().getNombre() : StringUtils.EMPTY);
				}
			}			
		});
		
		cmbPolicia.addListener((ValueChangeListener)this);
		
		cmbOficina.setItemCaptionPropertyId("nombre");
		cmbOficina.setInputPrompt("Oficina");
		
		lstDependencias = dependenciasService.buscar(null);
		BeanItemContainer<Dependencia> bicDependencias = new BeanItemContainer<Dependencia>(Dependencia.class,  lstDependencias);
		cmbOficina.setContainerDataSource(bicDependencias);	
		cmbOficina.setFilteringMode(Filtering.FILTERINGMODE_CONTAINS);
		cmbOficina.setImmediate(true);
		cmbOficina.addListener((ValueChangeListener)this);
		
		tblUsuarios.setSelectable(true);
		tblUsuarios.setImmediate(true);
		tblUsuarios.setNullSelectionAllowed(true);
		tblUsuarios.setNullSelectionItemId(null);
		
		habilitarBoton(false);
		btnCrearUsuario.addListener((ClickListener)this);
		btnEliminarUsuario.addListener((ClickListener)this);
		btnAgregarPolicia.addListener((ClickListener)this);
				
		tblUsuarios.addListener(new ValueChangeListener() {
			private static final long serialVersionUID = -6124596484581515359L;
			@Override
			public void valueChange(ValueChangeEvent event) {
				boolean esModoNuevo = tblUsuarios.getValue() == null;
				habilitarBoton(!esModoNuevo);
				limpiar();
				if(esModoNuevo){
					tblUsuarios.setValue(null);
					habilitarEdicion(esModoNuevo);
				}else {
					Item item = tblUsuarios.getItem(tblUsuarios.getValue());
					clave = item.getItemProperty("clave").getValue().toString();
					txtUsuario.setValue(item.getItemProperty("usuario").getValue());
					txtNombres.setValue(item.getItemProperty("nombres").getValue());
					txtApellidoPaterno.setValue(item.getItemProperty("apePat").getValue());
					txtApellidoMaterno.setValue(item.getItemProperty("apeMat").getValue());
					cmbPolicia.select(item.getItemProperty("policia").getValue());
					cmbOficina.select(item.getItemProperty("dependencia").getValue());
					cmbRol.select(item.getItemProperty("rol").getValue());
					txtCargo.setValue(item.getItemProperty("cargo").getValue()!= null ? item.getItemProperty("cargo").getValue() : StringUtils.EMPTY);
					txtCargoDescripcion.setValue(item.getItemProperty("descCargo").getValue() != null ? item.getItemProperty("descCargo").getValue() : StringUtils.EMPTY);
					habilitarEdicion(esModoNuevo);
				}
			}
		});
		
		txtFiltroUsuario.addShortcutListener(new ShortcutListener("", KeyCode.ENTER, null) {			
			private static final long serialVersionUID = 4068232062569621771L;
			@Override
			public void handleAction(Object sender, Object target) {
				shortCutEnter(sender, target);
			}
		});		
		txtFiltroNombres.addShortcutListener(new ShortcutListener("", KeyCode.ENTER, null) {			
			private static final long serialVersionUID = 4068232062569621771L;
			@Override
			public void handleAction(Object sender, Object target) {
				shortCutEnter(sender, target);
			}
		});
		txtFiltroApePaterno.addShortcutListener(new ShortcutListener("", KeyCode.ENTER, null) {			
			private static final long serialVersionUID = 4068232062569621771L;
			@Override
			public void handleAction(Object sender, Object target) {
				shortCutEnter(sender, target);
			}
		});
		txtFiltroApeMaterno.addShortcutListener(new ShortcutListener("", KeyCode.ENTER, null) {			
			private static final long serialVersionUID = 4068232062569621771L;
			@Override
			public void handleAction(Object sender, Object target) {
				shortCutEnter(sender, target);
			}
		});
		txtFiltroCargo.addShortcutListener(new ShortcutListener("", KeyCode.ENTER, null) {			
			private static final long serialVersionUID = 4068232062569621771L;
			@Override
			public void handleAction(Object sender, Object target) {
				shortCutEnter(sender, target);
			}
		});		
		txtFiltroOficina.addShortcutListener(new ShortcutListener("", KeyCode.ENTER, null) {			
			private static final long serialVersionUID = 4068232062569621771L;
			@Override
			public void handleAction(Object sender, Object target) {
				shortCutEnter(sender, target);
			}
		});
		
		txtUsuario.setImmediate(true);
		txtNombres.setImmediate(true);
		txtApellidoPaterno.setImmediate(true);
		txtApellidoMaterno.setImmediate(true);
		txtCargo.setImmediate(true);
		txtFiltroOficina.setImmediate(true);
		
		txtUsuario.addListener((TextChangeListener)this);
		txtNombres.addListener((TextChangeListener)this);
		txtApellidoPaterno.addListener((TextChangeListener)this);
		txtApellidoMaterno.addListener((TextChangeListener)this);
		txtCargo.addListener((TextChangeListener)this);
		txtFiltroOficina.addListener((TextChangeListener)this);
		
		lstUsuarios = usuarioService.buscar(null);
		cargarUsuarios(lstUsuarios, true);
	}
	
	private void shortCutEnter(Object sender, Object target){
		
		if(txtFiltroUsuario.equals(target) ||  txtFiltroNombres.equals(target) || txtFiltroApePaterno.equals(target) || txtFiltroApeMaterno.equals(target) || txtFiltroCargo.equals(target) || txtFiltroOficina.equals(target)){
			Usuario usuario = null;
			
			if(txtFiltroUsuario.equals(target)){
				usuario = new Usuario();
				
				if(StringUtils.isNotBlank(txtFiltroUsuario.getValue().toString()))
					usuario.setUsuario(txtFiltroUsuario.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroNombres.getValue().toString()))
					usuario.setNombres(txtFiltroNombres.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApePaterno.getValue().toString()))
					usuario.setApePat(txtFiltroApePaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApeMaterno.getValue().toString()))
					usuario.setApeMat(txtFiltroApeMaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroCargo.getValue().toString()))
					usuario.setCargo(txtFiltroCargo.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroOficina.getValue().toString())){
					Dependencia oficina = new Dependencia();
					oficina.setNombre(txtFiltroOficina.getValue().toString());
					usuario.setOficina(oficina);
				}
			}
			
			if(txtFiltroNombres.equals(target)){
				usuario = new Usuario();
				
				if(StringUtils.isNotBlank(txtFiltroUsuario.getValue().toString()))
					usuario.setUsuario(txtFiltroUsuario.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroNombres.getValue().toString()))
					usuario.setNombres(txtFiltroNombres.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApePaterno.getValue().toString()))
					usuario.setApePat(txtFiltroApePaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApeMaterno.getValue().toString()))
					usuario.setApeMat(txtFiltroApeMaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroCargo.getValue().toString()))
					usuario.setCargo(txtFiltroCargo.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroOficina.getValue().toString())){
					Dependencia oficina = new Dependencia();
					oficina.setNombre(txtFiltroOficina.getValue().toString());
					usuario.setOficina(oficina);
				}
			}
			
			if(txtFiltroApePaterno.equals(target)){
				usuario = new Usuario();
				
				if(StringUtils.isNotBlank(txtFiltroUsuario.getValue().toString()))
					usuario.setUsuario(txtFiltroUsuario.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroNombres.getValue().toString()))
					usuario.setNombres(txtFiltroNombres.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApePaterno.getValue().toString()))
					usuario.setApePat(txtFiltroApePaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApeMaterno.getValue().toString()))
					usuario.setApeMat(txtFiltroApeMaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroCargo.getValue().toString()))
					usuario.setCargo(txtFiltroCargo.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroOficina.getValue().toString())){
					Dependencia oficina = new Dependencia();
					oficina.setNombre(txtFiltroOficina.getValue().toString());
					usuario.setOficina(oficina);
				}
			}
			
			if(txtFiltroApeMaterno.equals(target)){
				usuario = new Usuario();
				
				if(StringUtils.isNotBlank(txtFiltroUsuario.getValue().toString()))
					usuario.setUsuario(txtFiltroUsuario.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroNombres.getValue().toString()))
					usuario.setNombres(txtFiltroNombres.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApePaterno.getValue().toString()))
					usuario.setApePat(txtFiltroApePaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApeMaterno.getValue().toString()))
					usuario.setApeMat(txtFiltroApeMaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroCargo.getValue().toString()))
					usuario.setCargo(txtFiltroCargo.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroOficina.getValue().toString())){
					Dependencia oficina = new Dependencia();
					oficina.setNombre(txtFiltroOficina.getValue().toString());
					usuario.setOficina(oficina);
				}
			}
			
			if(txtFiltroCargo.equals(target)){
				usuario = new Usuario();
				
				if(StringUtils.isNotBlank(txtFiltroUsuario.getValue().toString()))
					usuario.setUsuario(txtFiltroUsuario.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroNombres.getValue().toString()))
					usuario.setNombres(txtFiltroNombres.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApePaterno.getValue().toString()))
					usuario.setApePat(txtFiltroApePaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApeMaterno.getValue().toString()))
					usuario.setApeMat(txtFiltroApeMaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroCargo.getValue().toString()))
					usuario.setCargo(txtFiltroCargo.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroOficina.getValue().toString())){
					Dependencia oficina = new Dependencia();
					oficina.setNombre(txtFiltroOficina.getValue().toString());
					usuario.setOficina(oficina);
				}
			}
			
			if(txtFiltroOficina.equals(target)){
				usuario = new Usuario();
				
				if(StringUtils.isNotBlank(txtFiltroUsuario.getValue().toString()))
					usuario.setUsuario(txtFiltroUsuario.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroNombres.getValue().toString()))
					usuario.setNombres(txtFiltroNombres.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApePaterno.getValue().toString()))
					usuario.setApePat(txtFiltroApePaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroApeMaterno.getValue().toString()))
					usuario.setApeMat(txtFiltroApeMaterno.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroCargo.getValue().toString()))
					usuario.setCargo(txtFiltroCargo.getValue().toString());
				
				if(StringUtils.isNotBlank(txtFiltroOficina.getValue().toString())){
					Dependencia oficina = new Dependencia();
					oficina.setNombre(txtFiltroOficina.getValue().toString());
					usuario.setOficina(oficina);
				}
			}
			
			if (usuario != null) {				
				lstUsuarios = usuarioService.buscar(usuario);		
				cargarUsuarios(lstUsuarios, true);
			}
		}		
	}
		
	private void cargarUsuarios(List<Usuario> lstUsuarios, boolean flagLimpiar){
		
		IndexedContainer container = new IndexedContainer();
		container.addContainerProperty("id", Long.class,  null);
		container.addContainerProperty("usuario", String.class, null);
		container.addContainerProperty("clave", String.class, null);
		container.addContainerProperty("nombres", String.class, null);
		container.addContainerProperty("apePat", String.class, null);
		container.addContainerProperty("apeMat", String.class, null);
		container.addContainerProperty("cargo", String.class, null);
		container.addContainerProperty("descCargo", String.class, null);
		container.addContainerProperty("rol", Rol.class, null);
		container.addContainerProperty("policia", Policia.class, null);
		container.addContainerProperty("dependencia", Dependencia.class, null);
		container.addContainerProperty("oficina.id", Long.class, null);
		container.addContainerProperty("oficina.nombre", String.class, null);
		container.addContainerProperty("rol.id", Long.class, null);
		
		tblUsuarios.setContainerDataSource(container);
		tblUsuarios.setVisibleColumns(new Object[]{"usuario","nombres","apePat", "apeMat","cargo","oficina.nombre"});
	
		tblUsuarios.setColumnWidth("usuario", 50);
		tblUsuarios.setColumnWidth("nombres", 75);
		tblUsuarios.setColumnWidth("apePat", 75);
		tblUsuarios.setColumnWidth("apeMat", 75);
		tblUsuarios.setColumnWidth("cargo", 130);	
		tblUsuarios.setColumnWidth("oficina.nombre", 160);
		
		tblUsuarios.setColumnHeader("usuario", "Usuario");
		tblUsuarios.setColumnHeader("nombres", "Nombres");
		tblUsuarios.setColumnHeader("apePat", "Ape. Paterno");
		tblUsuarios.setColumnHeader("apeMat", "Ape. Materno");		
		tblUsuarios.setColumnHeader("cargo", "Cargo");
		tblUsuarios.setColumnHeader("oficina.nombre", "Oficina");
		
		int con=1;
		for (Usuario usuario: lstUsuarios){
			Item item = container.addItem(con++);
			item.getItemProperty("id").setValue(usuario.getId());
			item.getItemProperty("usuario").setValue(usuario.getUsuario());
			item.getItemProperty("clave").setValue(usuario.getClave());
			item.getItemProperty("nombres").setValue(usuario.getNombres());
			item.getItemProperty("apePat").setValue(usuario.getApePat());
			item.getItemProperty("apeMat").setValue(usuario.getApeMat());
			item.getItemProperty("rol").setValue(usuario.getRol());
			item.getItemProperty("cargo").setValue(usuario.getCargo());
			item.getItemProperty("dependencia").setValue(usuario.getOficina());
			item.getItemProperty("policia").setValue(usuario.getPolicia());
			item.getItemProperty("descCargo").setValue(usuario.getDescCargo());
			item.getItemProperty("rol.id").setValue(usuario.getRol() != null ? usuario.getRol().getId() : null);
			item.getItemProperty("oficina.id").setValue(usuario.getOficina() != null ? usuario.getOficina().getId() : null);
			item.getItemProperty("oficina.nombre").setValue(usuario.getOficina()!= null ? usuario.getOficina().getNombre() : null);
		}
		limpiar();
	}
		
	@Override
	public void buttonClick(ClickEvent event) {				
		if(event.getButton().equals(btnCrearUsuario)){
			Usuario object = new Usuario(); 
			object.setUsuario(txtUsuario.getValue().toString());
			object.setNombres(txtNombres.getValue().toString());
			object.setApePat(txtApellidoPaterno.getValue().toString());
			object.setApeMat(txtApellidoMaterno.getValue().toString());
			
			object.setRol((Rol)cmbRol.getValue());
			object.setCargo(txtCargo.getValue() != null ? txtCargo.getValue().toString() : StringUtils.EMPTY);
			object.setDescCargo(txtCargoDescripcion.getValue() != null ? txtCargoDescripcion.getValue().toString() : StringUtils.EMPTY);
			object.setOficina((Dependencia)cmbOficina.getValue());
			object.setPolicia((Policia)cmbPolicia.getValue());
			
			if(flagNuevoUsuario){
				String randomPassword = RandomUtil.createWord(8);
				object.setClave(randomPassword);
				usuarioService.crear(object);
			}else{
				object.setClave(clave);
				Item item = tblUsuarios.getItem(tblUsuarios.getValue());
				object.setId((Long)item.getItemProperty("id").getValue());
				usuarioService.actualizar(object);
			}
			refrescar();
		}else if (event.getButton().equals(btnEliminarUsuario)){
			ConfirmDialog.show(getApplication().getMainWindow() , "¿Seguro de Eliminar el Registro?", new ConfirmDialog.Listener() {				
				private static final long serialVersionUID = 1L;
				public void onClose(ConfirmDialog dialog) {
	                if (dialog.isConfirmed()) {
	                	Item item = tblUsuarios.getItem(tblUsuarios.getValue());					
	    				usuarioService.eliminarXId((Long)item.getItemProperty("id").getValue());
	    				refrescar();
	                }
	            }
	        });
		}else if (event.getButton().equals(btnAgregarPolicia)) {
			cargarWindowRegistroPolicia();
		}
	}
	
	private void cargarWindowRegistroPolicia(){
		pnlMantenPolicia = new PanelMantenPolicia(new ArrayList<Opcion>(), "400px");
		pnlMantenPolicia.setParent(this.getParent());
		
		Window window=new Window(){
			
			private static final long serialVersionUID = 1L;

			protected void close() {
				getApplication().getMainWindow().removeWindow(getWindow());
			}
		};
		      
		window.setCaption("Registrar Policia");
		window.addComponent(pnlMantenPolicia);
		window.setModal(true);
		window.setResizable(false);
		window.setWidth("1000px");
		window.setHeight("-1px");
		getWindow().addWindow(window);
	}
	
	//** Utilitarios **//
	private void limpiar(){
		txtFiltroUsuario.setValue("");
		txtFiltroNombres.setValue("");
		txtFiltroApePaterno.setValue("");
		txtFiltroApeMaterno.setValue("");
		txtFiltroCargo.setValue("");
		txtFiltroOficina.setValue("");
		
		clave="";
		txtUsuario.setValue("");
		txtNombres.setValue("");
		txtApellidoPaterno.setValue("");
		txtApellidoMaterno.setValue("");
		txtCargo.setValue("");
		txtCargoDescripcion.setValue("");
		cmbOficina.select(null);
		cmbPolicia.select(null);
		cmbRol.select(null);		
	}
	
	private void refrescar(){
		habilitarEdicion(false);
		limpiar();
		lstUsuarios = usuarioService.buscar(null);
		cargarUsuarios(lstUsuarios, true);
	}
	
	private void habilitarEdicion(boolean flag){
		flagNuevoUsuario = flag;
		if(flag){
			btnCrearUsuario.setCaption("Crear");
			btnCrearUsuario.setEnabled(true);
		}else{
			btnCrearUsuario.setCaption("Actualizar");
			btnCrearUsuario.setEnabled(false);
		}
	}	
	
	private void habilitarBoton(boolean flag){	
		btnEliminarUsuario.setEnabled(flag);		
	}
	
	@Override
	public void textChange(TextChangeEvent event) {
		if (event.getSource().equals(txtUsuario)
				|| event.getSource().equals(txtNombres)
				|| event.getSource().equals(txtApellidoPaterno)
				|| event.getSource().equals(txtApellidoMaterno)
				|| event.getSource().equals(txtCargo)
				|| event.getSource().equals(txtCargoDescripcion))
			formHasChanged();
	}
	
	@Override
	public void valueChange(ValueChangeEvent event) {
		if (event.getProperty().equals(cmbRol) || event.getProperty().equals(cmbPolicia) || event.getProperty().equals(cmbOficina))
			formHasChanged();
	}

	
	public void formHasChanged() {
	    btnCrearUsuario.setEnabled(true);
	}	

	@AutoGenerated
	private VerticalLayout buildMainLayout() {
		// common part: create layout
		mainLayout = new VerticalLayout();
		mainLayout.setImmediate(false);
		mainLayout.setWidth("100%");
		mainLayout.setHeight("-1px");
		mainLayout.setMargin(true);
		
		// top-level component properties
		setWidth("100.0%");
		setHeight("-1px");
		
		// pnlPrincipal
		pnlPrincipal = buildPnlPrincipal();
		mainLayout.addComponent(pnlPrincipal);
		mainLayout.setComponentAlignment(pnlPrincipal, new Alignment(20));
		
		return mainLayout;
	}

	@AutoGenerated
	private HorizontalLayout buildPnlPrincipal() {
		// common part: create layout
		pnlPrincipal = new HorizontalLayout();
		pnlPrincipal.setStyleName("whiteBackGround");
		pnlPrincipal.setImmediate(false);
		pnlPrincipal.setWidth("-1px");
		pnlPrincipal.setHeight("-1px");
		pnlPrincipal.setMargin(true);
		pnlPrincipal.setSpacing(true);
		
		// verticalLayout_2
		verticalLayout_2 = buildVerticalLayout_2();
		pnlPrincipal.addComponent(verticalLayout_2);
		
		// verticalLayout_3
		verticalLayout_3 = buildVerticalLayout_3();
		pnlPrincipal.addComponent(verticalLayout_3);
		
		return pnlPrincipal;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_2() {
		// common part: create layout
		verticalLayout_2 = new VerticalLayout();
		verticalLayout_2.setImmediate(false);
		verticalLayout_2.setWidth("-1px");
		verticalLayout_2.setHeight("-1px");
		verticalLayout_2.setMargin(false);
		
		// label_1
		label_1 = new Label();
		label_1.setStyleName("h1");
		label_1.setImmediate(false);
		label_1.setWidth("-1px");
		label_1.setHeight("-1px");
		label_1.setValue("Filtro de Busqueda de Usuarios");
		verticalLayout_2.addComponent(label_1);
		
		// horizontalLayout_3
		horizontalLayout_3 = buildHorizontalLayout_3();
		verticalLayout_2.addComponent(horizontalLayout_3);
		
		// tblUsuarios
		tblUsuarios = new Table();
		tblUsuarios.setImmediate(false);
		tblUsuarios.setWidth("650px");
		tblUsuarios.setHeight("430px");
		verticalLayout_2.addComponent(tblUsuarios);
		
		return verticalLayout_2;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_3() {
		// common part: create layout
		horizontalLayout_3 = new HorizontalLayout();
		horizontalLayout_3.setImmediate(false);
		horizontalLayout_3.setWidth("-1px");
		horizontalLayout_3.setHeight("-1px");
		horizontalLayout_3.setMargin(false);
		
		// txtFiltroUsuario
		txtFiltroUsuario = new TextField();
		txtFiltroUsuario.setImmediate(false);
		txtFiltroUsuario.setWidth("65px");
		txtFiltroUsuario.setHeight("-1px");
		txtFiltroUsuario.setInputPrompt("Usuario");
		horizontalLayout_3.addComponent(txtFiltroUsuario);
		
		// txtFiltroNombres
		txtFiltroNombres = new TextField();
		txtFiltroNombres.setImmediate(false);
		txtFiltroNombres.setWidth("86px");
		txtFiltroNombres.setHeight("-1px");
		txtFiltroNombres.setInputPrompt("Nombres");
		horizontalLayout_3.addComponent(txtFiltroNombres);
		
		// txtFiltroApePaterno
		txtFiltroApePaterno = new TextField();
		txtFiltroApePaterno.setImmediate(false);
		txtFiltroApePaterno.setWidth("88px");
		txtFiltroApePaterno.setHeight("-1px");
		txtFiltroApePaterno.setInputPrompt("Ape. Paterno");
		horizontalLayout_3.addComponent(txtFiltroApePaterno);
		
		// txtFiltroApeMaterno
		txtFiltroApeMaterno = new TextField();
		txtFiltroApeMaterno.setImmediate(false);
		txtFiltroApeMaterno.setWidth("90px");
		txtFiltroApeMaterno.setHeight("-1px");
		txtFiltroApeMaterno.setInputPrompt("Ape. Materno");
		horizontalLayout_3.addComponent(txtFiltroApeMaterno);
		
		// txtFiltroCargo
		txtFiltroCargo = new TextField();
		txtFiltroCargo.setImmediate(false);
		txtFiltroCargo.setWidth("142px");
		txtFiltroCargo.setHeight("-1px");
		txtFiltroCargo.setInputPrompt("Cargo");
		horizontalLayout_3.addComponent(txtFiltroCargo);
		
		// txtFiltroOficina
		txtFiltroOficina = new TextField();
		txtFiltroOficina.setImmediate(false);
		txtFiltroOficina.setWidth("171px");
		txtFiltroOficina.setHeight("-1px");
		txtFiltroOficina.setInputPrompt("Oficina");
		horizontalLayout_3.addComponent(txtFiltroOficina);
		
		return horizontalLayout_3;
	}

	@AutoGenerated
	private VerticalLayout buildVerticalLayout_3() {
		// common part: create layout
		verticalLayout_3 = new VerticalLayout();
		verticalLayout_3.setStyleName("h1");
		verticalLayout_3.setCaption("Administracion del Usuario");
		verticalLayout_3.setImmediate(false);
		verticalLayout_3.setWidth("-1px");
		verticalLayout_3.setHeight("-1px");
		verticalLayout_3.setMargin(true);
		verticalLayout_3.setSpacing(true);
		
		// txtUsuario
		txtUsuario = new TextField();
		txtUsuario.setCaption("Usuario:");
		txtUsuario.setImmediate(false);
		txtUsuario.setWidth("-1px");
		txtUsuario.setHeight("-1px");
		txtUsuario.setRequired(true);
		txtUsuario.setInputPrompt("Usuario de logueo ");
		verticalLayout_3.addComponent(txtUsuario);
		
		// horizontalLayout_1
		horizontalLayout_1 = buildHorizontalLayout_1();
		verticalLayout_3.addComponent(horizontalLayout_1);
		
		// txtNombres
		txtNombres = new TextField();
		txtNombres.setCaption("Nombre:");
		txtNombres.setImmediate(false);
		txtNombres.setWidth("164px");
		txtNombres.setHeight("-1px");
		txtNombres.setRequired(true);
		txtNombres.setInputPrompt("Nombre de inicio de sesión");
		verticalLayout_3.addComponent(txtNombres);
		
		// txtApellidoPaterno
		txtApellidoPaterno = new TextField();
		txtApellidoPaterno.setCaption("Paterno");
		txtApellidoPaterno.setImmediate(false);
		txtApellidoPaterno.setWidth("250px");
		txtApellidoPaterno.setHeight("-1px");
		txtApellidoPaterno.setRequired(true);
		txtApellidoPaterno.setInputPrompt("Apellido Paterno");
		verticalLayout_3.addComponent(txtApellidoPaterno);
		
		// txtApellidoMaterno
		txtApellidoMaterno = new TextField();
		txtApellidoMaterno.setCaption("Materno");
		txtApellidoMaterno.setImmediate(false);
		txtApellidoMaterno.setWidth("250px");
		txtApellidoMaterno.setHeight("-1px");
		txtApellidoMaterno.setRequired(true);
		txtApellidoMaterno.setInputPrompt("Apellido Materno");
		verticalLayout_3.addComponent(txtApellidoMaterno);
		
		// cmbOficina
		cmbOficina = new ComboBox();
		cmbOficina.setCaption("Oficina");
		cmbOficina.setImmediate(false);
		cmbOficina.setWidth("204px");
		cmbOficina.setHeight("-1px");
		cmbOficina.setRequired(true);
		verticalLayout_3.addComponent(cmbOficina);
		
		// cmbRol
		cmbRol = new ComboBox();
		cmbRol.setCaption("Rol");
		cmbRol.setImmediate(false);
		cmbRol.setWidth("194px");
		cmbRol.setHeight("-1px");
		cmbRol.setRequired(true);
		verticalLayout_3.addComponent(cmbRol);
		
		// txtCargo
		txtCargo = new TextField();
		txtCargo.setCaption("Cargo");
		txtCargo.setImmediate(false);
		txtCargo.setWidth("250px");
		txtCargo.setHeight("-1px");
		txtCargo.setRequired(true);
		txtCargo.setInputPrompt("Cargo que desempeña");
		verticalLayout_3.addComponent(txtCargo);
		
		// txtCargoDescripcion
		txtCargoDescripcion = new TextField();
		txtCargoDescripcion.setCaption("Descripcion del Cargo");
		txtCargoDescripcion.setImmediate(false);
		txtCargoDescripcion.setWidth("250px");
		txtCargoDescripcion.setHeight("-1px");
		txtCargoDescripcion.setRequired(true);
		txtCargoDescripcion
				.setInputPrompt("Breve descripcion del Cargo que desempeña");
		verticalLayout_3.addComponent(txtCargoDescripcion);
		
		// horizontalLayout_2
		horizontalLayout_2 = buildHorizontalLayout_2();
		verticalLayout_3.addComponent(horizontalLayout_2);
		verticalLayout_3.setComponentAlignment(horizontalLayout_2,
				new Alignment(48));
		
		return verticalLayout_3;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_1() {
		// common part: create layout
		horizontalLayout_1 = new HorizontalLayout();
		horizontalLayout_1.setImmediate(false);
		horizontalLayout_1.setWidth("-1px");
		horizontalLayout_1.setHeight("-1px");
		horizontalLayout_1.setMargin(false);
		horizontalLayout_1.setSpacing(true);
		
		// cmbPolicia
		cmbPolicia = new ComboBox();
		cmbPolicia.setCaption("Policia");
		cmbPolicia.setImmediate(false);
		cmbPolicia.setWidth("230px");
		cmbPolicia.setHeight("-1px");
		horizontalLayout_1.addComponent(cmbPolicia);
		
		// btnAgregarPolicia
		btnAgregarPolicia = new Button();
		btnAgregarPolicia.setCaption(" ");
		btnAgregarPolicia.setImmediate(true);
		btnAgregarPolicia.setWidth("-1px");
		btnAgregarPolicia.setHeight("-1px");
		horizontalLayout_1.addComponent(btnAgregarPolicia);
		horizontalLayout_1.setComponentAlignment(btnAgregarPolicia,
				new Alignment(9));
		
		return horizontalLayout_1;
	}

	@AutoGenerated
	private HorizontalLayout buildHorizontalLayout_2() {
		// common part: create layout
		horizontalLayout_2 = new HorizontalLayout();
		horizontalLayout_2.setImmediate(false);
		horizontalLayout_2.setWidth("-1px");
		horizontalLayout_2.setHeight("-1px");
		horizontalLayout_2.setMargin(true);
		horizontalLayout_2.setSpacing(true);
		
		// btnCrearUsuario
		btnCrearUsuario = new Button();
		btnCrearUsuario.setCaption("Crear");
		btnCrearUsuario.setImmediate(true);
		btnCrearUsuario.setWidth("80px");
		btnCrearUsuario.setHeight("-1px");
		horizontalLayout_2.addComponent(btnCrearUsuario);
		
		// btnEliminarUsuario
		btnEliminarUsuario = new Button();
		btnEliminarUsuario.setCaption("Eliminar");
		btnEliminarUsuario.setImmediate(true);
		btnEliminarUsuario.setWidth("-1px");
		btnEliminarUsuario.setHeight("-1px");
		horizontalLayout_2.addComponent(btnEliminarUsuario);
		
		return horizontalLayout_2;
	}

}
